﻿#pragma once
#include <unordered_map>
#include "ArrayList.hpp"
#include <optional>

namespace yzrilyzr_collection{
	template<typename K, typename V>
	EBCLASS(HashMap){
	private:
	std::unordered_map<K, V> map;
	public:
	u_index size(){
		return this->map.size();
	}
	void put(const K& k, const V &v){
		map[k]=v;
	}
	bool containsKey(const K & k){
		return map.find(k) != map.end();
	}
	std::optional<V> remove(const K & k){
		auto it=map.find(k);
		if(it != map.end()){
			V v=it->second;
			map.erase(k);
			return v;
		}
		return std::nullopt;
	}
	std::optional<V> get(const K & k){
		auto it=map.find(k);
		if(it != map.end()){
			return it->second;
		}
		return std::nullopt;
	}
	void clear(){
		map.clear();
	}
	std::shared_ptr<ArrayList<V>> values(){
		ArrayList<V> * arr=new ArrayList<V>(size());
		for(std::pair<K, V> a : map){
			if((void *)a.second != nullptr)arr->add(a.second);
		}
		return std::shared_ptr<ArrayList<V>>(arr);
	}
	std::shared_ptr<ArrayList<K>> keys(){
		K * keys=new K[size()];
		u_index i=0;
		for(auto & a : map){
			keys[i]=a.first;
			i++;
		}
		return std::shared_ptr<ArrayList<K>>(new ArrayList<K>(keys, i));
	}
	std::unordered_map<K, V> & entries(){
		return map;
	}
	};
}